home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -in_the_mag- / emulation / amiga / uae-0.7.0b2 / src / genblitter.c < prev    next >
C/C++ Source or Header  |  1998-01-20  |  11KB  |  266 lines

  1.  /*
  2.   * UAE - The Un*x Amiga Emulator
  3.   *
  4.   * Optimized blitter minterm function generator
  5.   *
  6.   * Copyright 1995,1996 Bernd Schmidt
  7.   * Copyright 1996 Alessandro Bissacco
  8.   */
  9.  
  10. #include "sysconfig.h"
  11. #include "sysdeps.h"
  12.  
  13. #include "genblitter.h"
  14.  
  15. /* Here is the minterm table used in blitter function generation */
  16.  
  17. static unsigned char blttbl[]= {
  18.     0x00, 0x0a, 0x2a, 0x30, 0x3a, 0x3c, 0x4a, 0x6a, 0x8a, 0x8c, 0x9a, 0xa8,
  19.     0xaa, 0xb1, 0xca, 0xcc, 0xd8, 0xe2, 0xea, 0xf0, 0xfa, 0xfc
  20. };
  21.  
  22. static void generate_include(void)
  23. {
  24.     int minterm;
  25.     printf("static __inline__ uae_u32 blit_func(uae_u32 srca, uae_u32 srcb, uae_u32 srcc, uae_u8 mt)\n{\nswitch(mt){\n");
  26.     for (minterm = 0; minterm < 256; minterm++) {
  27.     printf("case 0x%x:\n", minterm);
  28.     printf("\treturn %s;\n", blitops[minterm].s);
  29.     }
  30.     printf("}\n");
  31.     printf("return 0;\n"); /* No, sir, it doesn't! */
  32.     printf("}\n");
  33. }
  34.  
  35. static void generate_func(void)
  36. {
  37.     unsigned int i;
  38.     printf("#include \"sysconfig.h\"\n");
  39.     printf("#include \"sysdeps.h\"\n");
  40.     printf("#include \"config.h\"\n");
  41.     printf("#include \"options.h\"\n");
  42.     printf("#include \"custom.h\"\n");
  43.     printf("#include \"memory.h\"\n");
  44.     printf("#include \"blitter.h\"\n");
  45.     printf("#include \"blitfunc.h\"\n\n");
  46.  
  47.     for (i = 0; i < sizeof(blttbl); i++) {
  48.     int active = blitops[blttbl[i]].used;
  49.     int a_is_on = active & 1, b_is_on = active & 2, c_is_on = active & 4;
  50.  
  51.     printf("void blitdofast_%x(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)\n",blttbl[i]);
  52.     printf("{\n");
  53.     printf("int i,j;\n");
  54.     printf("uae_u32 totald = 0;\n");
  55.     printf("if (currprefs.blits_32bit_enabled && b->hblitsize > 1");
  56.     if (a_is_on) printf(" && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff");
  57.     if (b_is_on) printf(" && !b->blitbshift");
  58.     printf(") {\n");
  59.     if (a_is_on) printf("uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;\n");
  60.     if (b_is_on) printf("uae_u32 srcb=((uae_u32)b->bltbdat << 16) | b->bltbdat;\n");
  61.     if (c_is_on) printf("uae_u32 srcc=((uae_u32)b->bltcdat << 16) | b->bltcdat;\n");
  62.     printf("uae_u32 dest;\n");
  63.     printf("int count=b->hblitsize/2, oddword=b->hblitsize&1;\n");
  64.     printf("for (j=0;j<b->vblitsize;j++) {\n");
  65.     printf("\tfor(i=0;i<count;i++) {\n");
  66.     if (a_is_on) printf("\t\tif (pta) {srca=*((uae_u32 *)pta); pta += 4;}\n");
  67.     if (b_is_on) printf("\t\tif (ptb) {srcb=*((uae_u32 *)ptb); ptb += 4;}\n");
  68.     if (c_is_on) printf("\t\tif (ptc) {srcc=*((uae_u32 *)ptc); ptc += 4;}\n");
  69.     printf("\t\tdest = %s;\n", blitops[blttbl[i]].s);
  70.     printf("\t\ttotald |= dest;\n");
  71.     printf("\t\tif (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}\n");
  72.     printf("\t}\n");
  73.     printf("\tif (oddword) {\n");
  74.     if (a_is_on) printf("\t\tif (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }\n");
  75.     if (b_is_on) printf("\t\tif (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb += 2; }\n");
  76.     if (c_is_on) printf("\t\tif (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc += 2; }\n");
  77.     printf("\t\tdest = %s;\n", blitops[blttbl[i]].s);
  78.     printf("\t\ttotald |= dest;\n");
  79.     printf("\t\tif (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }\n");
  80.     printf("\t}\n");
  81.     if (a_is_on) printf("\tif (pta) pta += b->bltamod;\n");
  82.     if (b_is_on) printf("\tif (ptb) ptb += b->bltbmod;\n");
  83.     if (c_is_on) printf("\tif (ptc) ptc += b->bltcmod;\n");
  84.     printf("\tif (ptd) ptd += b->bltdmod;\n");
  85.     printf("}\n");
  86.     if (a_is_on) printf("if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);\n"); /* Maybe not necessary, but I don't want problems */
  87.     if (b_is_on) printf("if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);\n");
  88.     if (c_is_on) printf("if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);\n");
  89.     printf("if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);\n");
  90.  
  91.     printf("} else {\n");
  92.     if (a_is_on) printf("uae_u32 preva = 0;\n");
  93.     if (b_is_on) printf("uae_u32 prevb = 0, srcb = b->bltbhold;\n");
  94.     if (c_is_on) printf("uae_u32 srcc = b->bltcdat;\n");
  95.     printf("uae_u32 dstd=0;\n");
  96.     printf("uae_u16 foo, *dstp = &foo;\n");
  97.     printf("for (j = 0; j < b->vblitsize; j++) {\n");
  98.     printf("\tfor (i = 0; i < b->hblitsize; i++) {\t\tuae_u32 bltadat, srca;\n\n");
  99.     if (c_is_on) printf("\t\tif (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc += 2; }\n");
  100.     if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tuae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb += 2;\n");
  101.     if (b_is_on) printf("\t\t\tsrcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;\n");
  102.     if (b_is_on) printf("\t\t\tprevb = bltbdat;\n\t\t}\n");
  103.     if (a_is_on) printf("\t\tif (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; }\n");
  104.     if (a_is_on) printf("\t\tbltadat &= blit_masktable[i];\n");
  105.     if (a_is_on) printf("\t\tsrca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;\n");
  106.     if (a_is_on) printf("\t\tpreva = bltadat;\n");
  107.     printf("\t\tdo_put_mem_word (dstp, dstd);\n");
  108.     printf("\t\tdstd = (%s) & 0xFFFF;\n", blitops[blttbl[i]].s);
  109.     printf("\t\ttotald |= dstd;\n");
  110.     printf("\t\tif (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }\n");
  111.     printf("\t}\n");
  112.     if (a_is_on) printf("\tif (pta) pta += b->bltamod;\n");
  113.     if (b_is_on) printf("\tif (ptb) ptb += b->bltbmod;\n");
  114.     if (c_is_on) printf("\tif (ptc) ptc += b->bltcmod;\n");
  115.     printf("\tif (ptd) ptd += b->bltdmod;\n");
  116.     printf("}\n");
  117.     if (b_is_on) printf("b->bltbhold = srcb;\n");
  118.     if (c_is_on) printf("b->bltcdat = srcc;\n");
  119.     printf("\t\tdo_put_mem_word (dstp, dstd);\n");
  120.     printf("}\n");
  121.     printf("if (totald != 0) b->blitzero = 0;\n");
  122.     printf("}\n");
  123.  
  124.     printf("void blitdofast_desc_%x(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)\n",blttbl[i]);
  125.     printf("{\n");
  126.     printf("uae_u32 totald = 0;\n");
  127.     printf("int i,j;\n");
  128.  
  129.     printf("if (currprefs.blits_32bit_enabled && b->hblitsize > 1");
  130.     if (a_is_on) printf(" && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff");
  131.     if (b_is_on) printf(" && !b->blitbshift");
  132.     printf(") {\n");
  133.     if (a_is_on) printf("uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;\n");
  134.     if (b_is_on) printf("uae_u32 srcb = ((uae_u32)b->bltbdat << 16) | b->bltbdat;\n");
  135.     if (c_is_on) printf("uae_u32 srcc = ((uae_u32)b->bltcdat << 16) | b->bltcdat;\n");
  136.     printf("uae_u32 dest;\n");
  137.     printf("int count=b->hblitsize/2, oddword=b->hblitsize&1;\n");
  138.     printf("for (j=0;j<b->vblitsize;j++) {\n");
  139.     printf("\tfor(i=0;i<count;i++) {\n");
  140.     if (a_is_on) printf("\t\tif (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}\n");
  141.     if (b_is_on) printf("\t\tif (ptb) { srcb=*((uae_u32 *)(ptb-2)); ptb -= 4;}\n");
  142.     if (c_is_on) printf("\t\tif (ptc) { srcc=*((uae_u32 *)(ptc-2)); ptc -= 4;}\n");
  143.     printf("\t\tdest = %s;\n", blitops[blttbl[i]].s);
  144.     printf("\t\ttotald |= dest;\n");
  145.     printf("\t\tif (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}\n");
  146.     printf("\t}\n");
  147.     printf("\tif (oddword) {\n");
  148.     if (a_is_on) printf("\t\tif (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }\n");
  149.     if (b_is_on) printf("\t\tif (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb -= 2; }\n");
  150.     if (c_is_on) printf("\t\tif (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc -= 2; }\n");
  151.     printf("\t\tdest = %s;\n", blitops[blttbl[i]].s);
  152.     printf("\t\ttotald |= dest;\n");
  153.     printf("\t\tif (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }\n");
  154.     printf("\t}\n");
  155.     if (a_is_on) printf("\tif (pta) pta -= b->bltamod;\n");
  156.     if (b_is_on) printf("\tif (ptb) ptb -= b->bltbmod;\n");
  157.     if (c_is_on) printf("\tif (ptc) ptc -= b->bltcmod;\n");
  158.     printf("\tif (ptd) ptd-=b->bltdmod;\n");
  159.     printf("}\n");
  160.     if (a_is_on) printf("if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);\n"); /* Maybe not necessary, but I don't want problems */
  161.     if (b_is_on) printf("if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);\n");
  162.     if (c_is_on) printf("if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);\n");
  163.     printf("if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);\n");
  164.  
  165.     printf("} else {\n");
  166.     if (a_is_on) printf("uae_u32 preva = 0;\n");
  167.     if (b_is_on) printf("uae_u32 prevb = 0, srcb = b->bltbhold;\n");
  168.     if (c_is_on) printf("uae_u32 srcc = b->bltcdat;\n");
  169.     printf("uae_u32 dstd=0;\n");
  170.     printf("uae_u16 foo, *dstp = &foo;\n");
  171.     printf("for (j = 0; j < b->vblitsize; j++) {\n");
  172.     printf("\tfor (i = 0; i < b->hblitsize; i++) {\n\t\tuae_u32 bltadat, srca;\n");
  173.     if (c_is_on) printf("\t\tif (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc -= 2; }\n");
  174.     if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tuae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb -= 2;\n");
  175.     if (b_is_on) printf("\t\t\tsrcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;\n");
  176.     if (b_is_on) printf("\t\t\tprevb = bltbdat;\n\t\t}\n");
  177.     if (a_is_on) printf("\t\tif (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; }\n");
  178.     if (a_is_on) printf("\t\tbltadat &= blit_masktable[i];\n");
  179.     if (a_is_on) printf("\t\tsrca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;\n");
  180.     if (a_is_on) printf("\t\tpreva = bltadat;\n");
  181.     printf("\t\tdo_put_mem_word (dstp, dstd);\n");
  182.     printf("\t\tdstd = (%s) & 0xFFFF;\n", blitops[blttbl[i]].s);
  183.     printf("\t\ttotald |= dstd;\n");
  184.     printf("\t\tif (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }\n");
  185.     printf("\t}\n");
  186.     if (a_is_on) printf("\tif (pta) pta -= b->bltamod;\n");
  187.     if (b_is_on) printf("\tif (ptb) ptb -= b->bltbmod;\n");
  188.     if (c_is_on) printf("\tif (ptc) ptc -= b->bltcmod;\n");
  189.     printf("\tif (ptd) ptd -= b->bltdmod;\n");
  190.     printf("}\n");
  191.     if (b_is_on) printf("b->bltbhold = srcb;\n");
  192.     if (c_is_on) printf("b->bltcdat = srcc;\n");
  193.     printf("\t\tdo_put_mem_word (dstp, dstd);\n");
  194.     printf("}\n");
  195.     printf("if (totald != 0) b->blitzero = 0;\n");
  196.     printf("}\n");
  197.     }
  198. }
  199.  
  200. static void generate_table(void)
  201. {
  202.     unsigned int index = 0;
  203.     unsigned int i;
  204.     printf("#include \"sysconfig.h\"\n");
  205.     printf("#include \"sysdeps.h\"\n");
  206.     printf("#include \"config.h\"\n");
  207.     printf("#include \"options.h\"\n");
  208.     printf("#include \"custom.h\"\n");
  209.     printf("#include \"memory.h\"\n");
  210.     printf("#include \"blitter.h\"\n");
  211.     printf("#include \"blitfunc.h\"\n\n");
  212.     printf("blitter_func *blitfunc_dofast[256] = {\n");
  213.     for (i = 0; i < 256; i++) {
  214.     if (index < sizeof(blttbl) && i == blttbl[index]) {
  215.         printf("blitdofast_%x",i);
  216.         index++;
  217.     }
  218.     else printf("0");
  219.     if (i < 255) printf(", ");
  220.     if ((i & 7) == 7) printf("\n");
  221.     }
  222.     printf("};\n\n");
  223.  
  224.     index = 0;
  225.     printf("blitter_func *blitfunc_dofast_desc[256] = {\n");
  226.     for (i = 0; i < 256; i++) {
  227.     if (index < sizeof(blttbl) && i == blttbl[index]) {
  228.         printf("blitdofast_desc_%x",i);
  229.         index++;
  230.     }
  231.     else printf("0");
  232.     if (i < 255) printf(", ");
  233.     if ((i & 7) == 7) printf("\n");
  234.     }
  235.     printf("};\n");
  236. }
  237.  
  238. static void generate_header(void)
  239. {
  240.     unsigned int i;
  241.     for (i = 0; i < sizeof(blttbl); i++) {
  242.     printf("extern blitter_func blitdofast_%x;\n",blttbl[i]);
  243.     printf("extern blitter_func blitdofast_desc_%x;\n",blttbl[i]);
  244.     }
  245. }
  246.  
  247. int main(int argc, char **argv)
  248. {
  249.     char mode = 'i';
  250.  
  251.     if (argc == 2) mode = *argv[1];
  252.     switch (mode) {
  253.      case 'i': generate_include();
  254.            break;
  255.      case 'f': generate_func();
  256.            break;
  257.      case 't': generate_table();
  258.            break;
  259.      case 'h': generate_header();
  260.            break;
  261.      default: abort();
  262.     }
  263.     return 0;
  264. }
  265.  
  266.